const express = require('express')
const app = express()

/**
 * 引入其他依赖模块
 */
const path = require('path')
const config = require('./config')
const checkLogin = require('./middlewares/checkLogin')

const indexRouter = require('./routes/index')
const adminRouter = require('./routes/admin')
const categoriesRouter = require('./routes/api/categories')
const userRouter = require('./routes/api/users')
const loginRouter = require('./routes/api/login')
const commonRouter = require('./routes/api/common')
const postsRouter = require('./routes/api/posts')

const template = require('express-art-template')

const errorhandler = require('errorhandler')
var notifier = require('node-notifier')

const session = require('express-session')
const MySQLStore = require('express-mysql-session')(session)

app.listen(config.port, () => {
  console.log(`alishow_server is running at http://${config.host}:${config.port}`)
})

/**
 * 配置中间件
 */
// 静态资源配置
app.use('/public', express.static(path.join(__dirname, 'public')))
app.use('/node_modules', express.static(path.join(__dirname, 'node_modules')))
app.use(express.json())
app.use(express.urlencoded({extended: false}))
// 模板引擎配置
app.engine('html', template)

app.use(session({
  // 生成密文是有一套算法的来计算生成密文，如果网站都使用默认的密文生成方式， 就会有一定的重复和被破解的概率，所以为了增加这个安全性，算法对外暴露了一个混入私钥的接口，算法在生成密文的时候会混入我们添加的自定义成分
  secret: 'itcast',
  resave: false,
  // 如果为 true 无论是否往 Session 中存储数据，都直接给客户端发送一个 Cookie 小票
  // 如果为 false，则只有在往 Session 中写入数据的时候才会下发小票
  // 推荐设置为 true
  saveUninitialized: true,
  store: new MySQLStore(config.db)
}))

app.use('/admin', checkLogin, (req, res, next) => {
  app.locals.userMessage = req.session.user
  next()
})

app.use(indexRouter)
app.use(adminRouter)
app.use(loginRouter)
app.use(categoriesRouter)
app.use(userRouter)
app.use(commonRouter)
app.use(postsRouter)

if (config.dev) {
  // 使用errorhandler美化错误输出页面
  app.use(errorhandler())
  // app.use(errorhandler({log: errorNotification}))
} else {
  app.use((err, req, res, next) => { // 错误处理中间件
    res.status(500).send(`服务器异常，请稍后重试`)
  })
  
}

// 将错误输出消息输出到系统通知
function errorNotification (err, str, req) { 
  var title = 'Error in ' + req.method + ' ' + req.url
  notifier.notify({ 
    title: title, 
    message: str 
  }) 
}

app.get('*', (req, res) => {
  res.send('404 Not Found')
})